//模块加载器
const fs = require("fs");
//项目模块配置
const mode = global.gem_config.global_module?global.gem_config.global_module:{};
const sugar = require(process.cwd()+mode['sugar']);
let suffix = [ ".js", '.json']

//核心文件，保存所有控制器的内容，并执行缓存：规则，控制器调用别的模块必须使用绝对路径
//开发中禁用缓存，使路由热启动
module.exports=function(path,bool=false){
    if(!path)return
    //判断是否为全局模块,是的话获取该模块的路径并且把路径解析出来
    path = sugar.path(mode[path]?mode[path]:path,3);
    //这有可能是系统模块
    if(!/[./\\]/g.test(path)){return require(path)}
    //路径解析成功后获取后缀
    if(path.match(/\.[^./]*$/g)){
      //存在后缀
      if(bool){delete require.cache[path]}
      return getFileData(path,path.match(/\.[^./]*$/g)[0]);
    }else{
      //没有后缀，遍历自动尝试
      let fun = suffix.map(res=>{
        if(fs.existsSync(path+res)){
           //存在文件
            if(bool){delete require.cache[path+res]}
            return getFileData(path+res,res);
        }
      }).filter(res=>res)
      if(fun.length===0){ console.log('模块不存在',path); return;}
      if(fun.length===1){ return fun[0]}
      return fun;
    }
}

//获取方法
function getFileData(path,hz)
{
  //文件不存在返回未定义
  if(!fs.existsSync(path))return undefined;
  //文件的后缀不等于js那就是json数据 直接读取返回
  if(hz!=='.js'){return require(path)}else{
    //否则就是一个js模块
    //读取文件
    let data = fs.readFileSync(path,"utf8");
     //这是一个模块
    if(data.includes('module.exports') || data.includes("exports."))return require(path);
    return synthetic(path);
  }
}
function synthetic(path){
  path = path.replace(/\//g,"\\");
  //杀死缓存 F:\\Project\\learning-state\\learning-state\\tools\\sugar.js
  delete require.cache[path];
  return ()=>{require(path)}
}